package com.mode5.m2_work;

import com.mode5.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 模式2：工作模式（Work单发送多接收）
 * 一个生产者端，多个消费者端。示例中为了保证消息发送的可靠性，不丢失消息，使消息持久化了。同时为了防止接收端在处理消息时down掉，只有在消息处理完成后才发送消息确认。
 *
 * 	//同一时刻服务器只发送1条消息给消费者（能者多劳，消费消息快的，会消费更多的消息）
 *  //保证在接收端一个消息没有处理完时不会接收另一个消息，即消费者端发送了ack后才会接收下一个消息。
 *  //在这种情况下生产者端会尝试把消息发送给下一个空闲的消费者。
 *
 *  //定义的消费者监听队列 autoAck：true自动返回结果，false手动返回
 *  channel.basicConsume(QUEUE_NAME, false,consumer1);
 *
 */
public class Producter {

    private final static String QUEUE_NAME = "work_queue";

    public static void main(String[] args) throws IOException, TimeoutException {
        //获取连接
        Connection connection = ConnectionUtil.getConnection();
        //声明信道
        Channel channel = connection.createChannel();
        //队列申明,durable：true消息持久化
        channel.queueDeclare(QUEUE_NAME, true, false, false, null);
        //消息内容
        String message = getMessage(args);
        for(int i = 0; i < 20; i++) {
            //发布消息
            //basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body)
            channel.basicPublish("", QUEUE_NAME, null, (i + " " +message).getBytes());
        }
        //关闭通道
        channel.close();
        //连接关闭
        connection.close();
    }

    private static String getMessage(String[] strings) {
        if(strings.length < 1) {
            return "Hello World!";
        }
        return joinStrings(strings, "");
    }

    private static String joinStrings(String[] strings, String delimiter) {
        int length = strings.length;
        if(length == 0) return "";
        StringBuilder words = new StringBuilder(strings[0]);
        for(int i = 0; i < length; i++) {
            words.append(delimiter).append(strings[i]);
        }
        return words.toString();
    }
}

